//
//  XGRootViewController.m
//  新闻
//
//  Created by 小果 on 16/3/30.
//  Copyright © 2016年 小果. All rights reserved.
//

#import "XGRootViewController.h"
#import "XGTopView.h"
#import "XGCategoryData.h"

#import "XGOptionView.h"
#import "XGSelectedView.h"

#import "XGSeparatorView.h"
#import "XGCategoryButton.h"

// 数据文件名常量
NSString * const kNewsCategoryDataFile = @"NewsCategoryOrder.json";

@interface XGRootViewController ()<XGTopViewDelegate>
{
    CGRect              _normalRect;        // 视图收起时的大小
    CGRect              _expandRect;        // 视图展开时的大小
    
    UIView              *_settingView;      // 设置视图容器（实现视图动画效果）
    XGSelectedView      *_selectedView;     // 选中按钮视图
    XGOptionView        *_optionView;       // 候选按钮视图
    XGSeparatorView     *_sepView;          // 分隔视图
}

@end

@implementation XGRootViewController

- (void)viewDidLoad {
    [super viewDidLoad];
   // 1、顶部视图
    CGRect rect = CGRectMake(0, 0, ScreenW, 30);
    XGTopView *top = [[XGTopView alloc] initWithFrame:rect];
    top.delegate = self;
    [self.view addSubview:top];
    // 2. 加载数据，从Cache目录加载的JSON数据
    NSArray *dataList = [XGCategoryData categoryDataList];
    // 1> 根据selected属性拆分数组
    NSArray *selectedList = [dataList filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"selected = 1"]];
    NSArray *unselectedList = [dataList filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"selected = 0"]];
    
    // 3. 添加设置视图
    CGRect sFrame = rect;
    sFrame.origin.y = rect.size.height;
    
    _settingView = [[UIView alloc] initWithFrame:sFrame];
    // 1> 选中按钮视图
    _selectedView = [[XGSelectedView alloc] initWithFrame:rect];
    _selectedView.backgroundColor = [UIColor redColor];
    _selectedView.dataList = [NSMutableArray arrayWithArray:selectedList];
    
    [_settingView addSubview:_selectedView];
    
    // 2> 候选按钮视图
    _optionView = [[XGOptionView alloc] initWithFrame:rect];
    _optionView.backgroundColor = [UIColor yellowColor];
    _optionView.dataList = [NSMutableArray arrayWithArray:unselectedList];
    _optionView.optionDelegate = self;
    [_settingView addSubview:_optionView];
    
    // 3> 分隔视图
    _sepView = [[XGSeparatorView alloc] initWithFrame:rect];
    [_settingView addSubview:_sepView];
    
    [self.view insertSubview:_settingView atIndex:0];
    
    // 隐藏设置视图
    _settingView.hidden = YES;
    //    // 3. 测试按钮
    //    NCCategoryButton *button = [[NCCategoryButton alloc] initWithFrame:CGRectMake(20, 0, 100, 30) title:@"测试按钮" index:0];
    //    [button addTarget:self action:@selector(click:) forControlEvents:UIControlEventTouchUpInside];
    //    [self.view addSubview:button];
}

// 测试按钮状态切换
//- (void)click:(NCCategoryButton *)button
//{
//    if (button.type == kNCButtonTypeNormal) {
//        button.type = kNCButtonTypeEdit;
//    } else if (button.type == kNCButtonTypeEdit) {
//        button.type = kNCButtonTypeMoveable;
//    } else {
//        button.type = kNCButtonTypeNormal;
//    }
//}

#pragma mark 重新调整视图布局
- (void)viewWillLayoutSubviews
{
    // 只要是视图大小发生变化，此方法都会被调用
    // 计算展开和收起时的视图大小，只需要计算一次
    // 如果还没有计算展开的大小，则计算一次
    if (CGRectIsEmpty(_expandRect)) {
        // 计算，为了便于代码的调整，不能将坐标值设定死，否则不利于代码的移植
        // 可以使用当前视图的父视图的边框来作为参照依据
        CGRect pFrame = self.view.superview.frame;
        
        // _normalRect是视图初始化时指定的大小
        _normalRect = self.view.frame;
        // 展开大小唯一需要变化的是高度，其它的数值与_normalRect一致
        _expandRect = _normalRect;
        _expandRect.size.height = pFrame.size.height - _normalRect.origin.y;
        
        [self relayoutSettingViews];
    }
    
    [super viewWillLayoutSubviews];
}

#pragma mark 重新布局设置视图中的子视图位置
- (void)relayoutSettingViews
{
    // 1. 选中按钮的位置(x = 0, y = 0, w = 320, h = 根据按钮数量计算)
    _selectedView.frame = [_selectedView rectForView];
    
    // 2. 分隔视图,只需要修改frame.origin.y
    CGRect sepFrame = _sepView.frame;
    sepFrame.origin.y = _selectedView.frame.size.height;
    _sepView.frame = sepFrame;
    
    // 3. 候选视图视图
    // 1> 计算出实际大小
    CGRect oFrame = [_optionView rectForView];
    // 2> 修改y值
    oFrame.origin.y = CGRectGetMaxY(sepFrame);
    _optionView.frame = oFrame;
    
    // 4. 调整设置视图的大小
    CGRect settingFrame = _settingView.frame;
    settingFrame.size.height = CGRectGetMaxY(oFrame);
    _settingView.frame = settingFrame;
}

#pragma mark - 顶部视图代理方法
#pragma mark 展开/收起状态
- (void)topViewExpandChanged:(BOOL)isExpand
{
    // 为什么要对视图大小进行处理？如果不调整大小，在界面上只能看见控件，但是无法交互
    if (isExpand) {
        NSLog(@"展开视图 %@", NSStringFromCGRect(_expandRect));
        self.view.frame = _expandRect;
        
        // 显示设置视图，此时已经有了正确的位置
        CGRect sFrame = _settingView.frame;
        CGRect fromRect = sFrame;
        fromRect.origin.y = -[UIScreen mainScreen].bounds.size.height;
        _settingView.frame = fromRect;
        _settingView.hidden = NO;
        
        [UIView animateWithDuration:1.0 animations:^{
            _settingView.frame = sFrame;
        }];
    } else {
        NSLog(@"收起视图");
        self.view.frame = _normalRect;
        
        _settingView.hidden = YES;
    }
}

#pragma mark 编辑状态变化
- (void)topViewEditModeChange:(kNCEditMode)editMode
{
    NSLog(@"编辑状态变化 %d", editMode);
    // 如果是可以拖动的模式
    if (editMode == kNCEditModeReorder) {
        _sepView.hidden = YES;
        _optionView.hidden = YES;
        
        _selectedView.isModified = YES;
    } else {
        _sepView.hidden = NO;
        _optionView.hidden = NO;
        
        _selectedView.isModified = NO;
    }
}

#pragma mark 选项视图代理方法
- (void)optionViewRemoveButtonWithIndex:(NSInteger)index
{
    // 1. 从选项视图中取出要删除的数据 data
    XGCategoryData *data = _optionView.dataList[index];
    
    // 2. 从选项视图中的数据列表中删除数据
    [_optionView.dataList removeObject:data];
    
    // 3. 将数据追加到选中视图的数据列表
    [_selectedView.dataList addObject:data];
    
    // 4. 重新计算子视图的布局(高度)
    [self relayoutSettingViews];
    
    // 5. 播放动画
    // 1> 创建一个临时按钮，起始位置
    // oRect是候选视图中的按钮所在位置
    CGRect oRect = [_optionView rectForIndexOfButton:index];
    // 进行坐标转换，将oRect转换为主视图坐标系中的rect
    CGRect fromRect = [self.view convertRect:oRect fromView:_optionView];
    // 2> 目标位置，追加到最后一个，在选中视图中的位置
    CGRect sRect = [_selectedView rectForIndexOfButton:_selectedView.dataList.count - 1];
    // 坐标转换
    CGRect toRect = [self.view convertRect:sRect fromView:_selectedView];
    
    // 3> 创建按钮
    XGCategoryButton *button = [[XGCategoryButton alloc] initWithFrame:fromRect title:data.categoryName index:0];
    button.type = kNCButtonTypeEdit;
    
    [self.view addSubview:button];
    
    // 4> 播放动画
    // 播放动画之前，禁用_optionView
    _optionView.userInteractionEnabled = NO;
    
    [UIView animateWithDuration:0.25 animations:^{
        button.frame = toRect;
    } completion:^(BOOL finished) {
        [button removeFromSuperview];
        
        // 在选中视图中，创建实际的按钮
        [_selectedView createButtonForIndex:(_selectedView.dataList.count - 1) data:data];
        
        _optionView.userInteractionEnabled = YES;
    }];
}

@end
